package 双指针;

import java.util.Arrays;
import java.util.Scanner;

public class test5 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
        test5 test5 = new test5();
        int i = test5.triangleNumber(nums);//实例化
        System.out.println(i);
    }
    public int triangleNumber(int[] nums){
        /**
         * 补充:
         * 给三个数是否能够构成三角形:
         * 只需要进行一次判断:已经知道三个数的大小顺序,只需要判定较小的两个数之和是否大于最大的数即可
         * (最大的数加上任意正数都是大于较小的两个数中的任意一个)
         */
        // 先对数组进行排序
        Arrays.sort(nums);
        int n = nums.length-1;
        int count = 0;
        while (n>1){
            // 如果n==1,就代表都找完了,因为只剩两条边了
            int left = 0,right = n-1; //判断left, right,n之间是否能构成关系
            if(nums[n]!=0)
                count+=getResult(left,right,n,nums);
            n--;
        }
        return count;
    }
    public static int getResult(int left,int right,int n,int[] nums){
        int count = 0;
        while (left<right){
            // 要保证必须有三条边
            if(nums[left]+nums[right]>nums[n]){
                count+=right-left;
                right--;
            }else
                left++;
        }
        return count;
    }
}
